Web resourceから別のWeb resourceに対する操作
以下の3つに大別される
reads
writes
embeds
Same-Origin PolicyやCORSを考える際は、この3つのそれぞれで、
Same-Origin、Cross-Originでの挙動の差異
CORSを適用する前後での挙動の差異
を見るとわかりやすいmrsekut.icon
tl;dr
table:_
Same-Origin (SOPあり) Cross-Origin (SOPあり) Cross-Origin & CORS
readsのsimple req 制限しない ほぼ禁止 Access-Control-Allow-Originを使えばできる
readsのnot simple req 制限しない ほぼ禁止 Preflight Requestを使えばできる??
writesのsimple req 制限しない 制限しない →元からできるので関係ない
writesのnot simple req 制限しない 禁止 Preflight Requestを使えばできる
embeds 制限しない 制限しない →元からできるので関係ない
「Cross-Origin (SOPあり)」の列が
「制限しない」になっているものがSOPが適用されないものになるmrsekut.icon
それ以外のものがSOPが適用されるものになるmrsekut.icon
writesのsimple reqのCross-Originの部分が「制限しない」になっているので、
SOPの有無に関わらず、simple requestの脆弱性対策はserver側で為されているはずであるという前提が存在することになる
readsのnot simple reqに??を付けているのは、writesの話とごっちゃになっている可能性があるからmrsekut.icon
writeを抜きにして、readを調べる方法がわからない
また、cross-originのiframeの内容をwindow経由で見ることはできない
reads
resourceの読み込みを指す
SOPが適用されるため、Cross Originなresourceにはアクセスできない
Uncaught DOMException: Blocked a frame with origin http... from accessing a cross-origin frame.のようなerrorが出る
例えば、
fetch API経由でresponseを受け取る
windowを経由したDOM操作
例えば、iframeで読み込まれているものをwindow.contentDocumentで読む
CORSをしたときはどうなる #??
fetchの方がわからん #??
iframeの方はいずれにしろ無理
つまり「reads」の中にも分岐がある #??
writes
networkを経由した書き込み
requestを送ることはできるが、responseを読むことはできない
resuponseはCross-Origin readsに該当するため
SOPは、Simple Request以外の時にのみ適用される
Simple Request以外のときは、Cross Originにrequestを送れない
Access to XXX at http... from origin http... has been blocked by CORS policyというerrorが表示される
Simple Requestの場合はSOPの有無に関わらず送ることができる
例えば、Simple Requestでの例
<a>などのリンク
リダイレクト
<form>の送信
Fetch APIによるrequestの発行
例えば、Simple Request以外での例
Fetch APIによる(Simple Requstの条件を満たしていない)requestの発行
embeds
Simple Requestをして得たものを画面に描画する
SOPの有無に関わらず、simple requestの脆弱性対策はserver側で為されているはずであるという前提があるので、Same OriginかCross Originかどうかに関わらず、制限はない
つまり、defaultで許可されている
だから、SOPの有無や、CORSの有無を考える際にembedsは考慮しないで良いmrsekut.icon
例えば
<script>で、scriptを読み込む
<link>で、CSSを読み込む
<img>で、画像が表示
<video>や<audio>でmedia fileを再生
<object>や<embed>での埋め込み
<iframe>での埋め込み
X-Frame-Optionsを使用するなどの例外はある
参考
『Webブラウザセキュリティ』 p.25
https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy#cross-origin_network_access
https://ieftimov.com/post/deep-dive-cors-history-how-it-works-best-practices/